/*!# future trait
 该 Future 特质是 Rust 异步编程中的核心。Future 是可以产生异步计算的值（尽管该值可以是空的，例如 ()）。
 一个简化的 Future 特质版本可能是这个样子：
trait SimpleFuture {
     type Output;
     fn poll(&mut self, wake: fn()) -> Poll<Self::Output>;
 }
  enum Poll<T> {
     Ready(T),
     Pending,
 }
通过调用该 poll 函数可以推进 Futures，这将推动 future 尽可能地完成。如果 Future 完成，它将返回 Poll::Ready(result)。
 如果 Future 尚未完成，它将返回 Poll::Pending 并安排在 Future 准备好进行更多进展时调用 wake() 函数。
 当 wake() 被调用时，executor(执行者) 驱动 Future 将再次调用 poll，以便 Future 能够取得更多进展。

 如果没有 wake()，executor(执行者) 将无法知道特定的 Futures 何时可以取得进展，并且必须不断地对每个 Futures 进行轮询。
 有了 wake()，执行者确切地知道哪些 future 准备好 poll。

 例如，考虑我们想要从可能已经或可能没有数据的套接字读取的情况。如果有数据，我们可以读取并返回 Poll::Ready(data)，
 但如果没有数据准备就绪，我们的 Futures 将被阻止，无法再进展。当没有数据可用时，我们必须注册 wake 在套接字上在准备好
 数据时进行调用，这将告诉执行者我们的 Futures 已准备好取得进展。

 一个简单的 SocketRead Futures 可能看起来像这样：

struct SocketRead<'a> {
     socket: &'a Socket,
 }

 impl SimpleFuture for SocketRead<'_> {
     type Output = Vec<u8>;

     fn poll(&mut self, wake: fn()) -> Poll<Self::Output> {
         if self.socket.has_data_to_read() {
             // 套接字拥有数据就读取数据到缓冲区并返回数据.
             Poll::Ready(self.socket.read_buf())
         } else {
             // 套接字没有数据
             // 安排 `wake` 在有数据之后能够被调用.
             // 当数据可获得的时候, `wake` 将被调用
             // 并且这个`Future` 的用户将知道再一次调用 `poll` 接收数据
             self.socket.set_readable_callback(wake);
             Poll::Pending
         }
     }
 }
!*/

use futures::executor::block_on;
async fn hello_world(){
    println!("hello world");
}

#[test]
pub fn future_demo(){
    let future = hello_world();
    //阻塞当前线程 直到提供的future执行完成
    block_on(future);
}

